Qual foi o padrão de desenvolvimento dos países no século XX? Como conseguimos identificar a tendência principal dessa evolução. Talvez mais importante, como identificar os casos que não seguem a tendência geral?
A decomposição de resíduos e tendências pode nos ajudar a responder essas perguntas, e as ferramentas de programação funcional nos permitirão fazê-lo em bases de dados mais complexas do que as que vimos até agora.
Na aula passada, vimos o funcionamento de modelos lineares. Hoje vamos explorá-los um pouco mais, mostrando como podemos separá-los analiticamente em tendências e resíduos
A ideia é evitar usar modelos como caixas pretas, que produzem resultados que não entendemos. Por meio de um modelo quantitativo que inclui informações disponíveis nos dados e na sua experiência, podemos abstrair conclusões que podem ser aplicadas em novos contextos.
Vamos introduzir o tema com um modelo simples de um banco de dados já conhecido, a fim de responder à seguinte pergunta: por que diamantes de pior qualidade são os mais caros?
Prosseguiremos com um banco de dados didáticos para identificar padrões de alocação de voos internacionais. Com as ferramentas que aprendermos nesses dois exemplos, seremos capazes de montar modelos mais complexos para identificar padrões de desenvolvimento internacional.
Diamantes om pior corte, clareza e pureza parecem ter preços similares aos dos seus pares por causa de uma variável omitida: o peso.
A relação fica ainda mais clara quando fazemos uma transformação logaritmica nas variáveis
Agora que observamos uma relação linear entre peso e preço, podemos começar a trabalhar na nossa decomposição entre elementos de tendência e de resíduo.
Uma vez que tiramos o componente linear dessa relação, os resíduos devem mostrar pouca associação entre peso e preço
O que vimos no exemplo anterior foi o processo de “controle” da variável peso, a fim de observar uma associação mais limpa entre a qualidade dos diamantes e seu preço. Como vimos ontem, podemos controlar por todas as variáveis ao mesmo tempo por meio da regressão.
Aparentemente, mesmo controlando por peso e quantidade, ainda há diamantes com preço maior do que o esperado!
Quais são os diamantes com maiores e menores resíduos de acordo com o modelo multivariado?
Esta base de dados vai nos ajudar a enxergar a riqueza das ferramentas de previsão e identificação de tendências. Vamos partir de uma base rica sobre voos nos Estados Unidos, e transformá-la em um banco com apenas 365 linhas e 2 colunas, registrando o número de vôos que saem de Nova York todos os dias.
Há um padrão claro nessa análise exploratória. Quais são os dias com queda tão forte de voos?
daily <- daily %>% mutate(wday = wday(date, label = TRUE))
ggplot(daily, aes(wday, n)) + geom_boxplot()Há um padrão claro de menos voos nos fins de semana. Vamos modelar?
O que podemos ver nos resíduos?
Existe uma alta clara no verão, mas o que acontece nos demais períodos? Vamos examinar:
Podemos observar que os outliers não deixam a interação melhorar o modelo
Um modelo robusto melhora bastante nossa previsão
Agora que temos as técnicas básicas, podemos fazer um exercício mais ambicioso. Vamos rodar vários modelos para entender um banco de dados mais complexo, com fenômenos parecidos com aqueles que costumamos estudar.
Isso vai exigir que a gente armazene resultados em estruturas mais sofisticadas. Assim, vamos conseguir separar tendências mais fortes nos dados para revelar padrões mais sutis, que talvez não pudéssemos capturar à primeira vista.
Vamos responder à seguinte pergunta: como a expectativa de vida evoluiu nos últimos anos em cada país?
Você vê uma tendência?
Já vimos como decompor o resíduo quando temos apenas um caso. Mas como podemos identificar os países que não seguem a tendência geral que observamos? Temos que rodar um a um?
O princípio da preguiça nos dá a resposta: não.
Queremos repetir a mesma operação para diferentes observações na nossa base de dados (ou seja, decompor tendência e resíduo por país).
Vamos usar uma estrutura de dados que tem apenas uma linha para cada país, e uma coluna especial chamada data. Esta coluna é uma lista de dataframes (dentro do nosso dataframe!)
Se olharmos para o valor de apenas uma dessas listas, vemos que ela contem todas as informaçõs, por ano, daquele país.
Portanto, agora temos uma base de dados em que cada linha não é só uma observação; é um conjunto delas!
Para poder rodar nosso modelo em cada conjunto de observações, vamos criar uma nova função:
Agora, podemos usar a função purrr::map para aplicar nosso modelo a cada conjunto de observações. And just like that, temos uma segunda lista de data frames dentro do nosso data frame
Neste ponto, nós temos 142 modelos na nossa base. Para fazer a análise de resíduos em todos eles, seguimos a mesma lógica:
Agora que já temos todos os cálculos que queríamos, podemos desaninhar os modelos para poder colocá-los em gráficos
Para ilustrar o poder das técnicas de redução de dimensionalidade, vamos explorar a base de dados de votações nominais da Assembleia Geral das Nações Unidas desde 1946.
As instruções da tarefa estão no arquivo NN-class-ds4ir-assignment.rmd da pasta assignment que se encontra na raiz desse projeto.